package com.evan.review.basic.collection;

import android.os.Bundle;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

import com.evan.review.R;

/**
 * 集合框架概述Activity
 * <p>
 * 本Activity详细介绍Java集合框架的整体层次结构、接口设计和主要实现类：
 * 1. 集合框架的顶层接口和抽象类
 * 2. Collection和Map体系及其区别
 * 3. 各种集合的特性比较
 * 4. 集合的选择原则
 * 5. 集合常用实现类的优缺点
 */
public class CollectionOverviewActivity extends AppCompatActivity {

    private TextView tvOutput;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_data_structure);

        setTitle("集合框架概述");

        tvOutput = findViewById(R.id.tv_output);

        // 展示集合框架的整体层次结构
        demonstrateCollectionHierarchy();

        // 展示Collection和Map接口
        demonstrateInterfaces();

        // 展示集合实现类对比
        demonstrateImplementationComparison();

        // 展示集合的常见使用场景
        demonstrateUsageScenarios();

        // 展示集合的选择原则
        demonstrateSelectionPrinciples();
    }

    /**
     * 展示集合框架的整体层次结构
     */
    private void demonstrateCollectionHierarchy() {
        StringBuilder output = new StringBuilder();
        output.append("=== Java集合框架层次结构 ===\n\n");

        // 1. 顶层接口
        output.append("1. 顶层接口：\n");
        output.append("• Iterable：所有集合的根接口，提供迭代能力\n");
        output.append("• Collection：继承自Iterable，集合框架的主要接口之一\n");
        output.append("• Map：集合框架的另一个主要接口（不继承Collection）\n\n");

        // 2. Collection子接口
        output.append("2. Collection子接口：\n");
        output.append("• List：有序集合，允许重复元素（例如ArrayList, LinkedList）\n");
        output.append("• Set：不允许重复元素（例如HashSet, TreeSet）\n");
        output.append("• Queue：队列接口，通常以FIFO方式操作元素（例如LinkedList）\n");
        output.append("• Deque：双端队列，支持两端插入和删除（例如ArrayDeque）\n\n");

        // 3. Map接口体系
        output.append("3. Map接口体系：\n");
        output.append("• Map：键值对映射，键不允许重复\n");
        output.append("• SortedMap：保持键的有序状态的Map\n");
        output.append("• NavigableMap：提供导航方法的SortedMap\n\n");

        // 4. 抽象类
        output.append("4. 抽象类：\n");
        output.append("• AbstractCollection：实现Collection接口的抽象类\n");
        output.append("• AbstractList：实现List接口的抽象类\n");
        output.append("• AbstractSet：实现Set接口的抽象类\n");
        output.append("• AbstractMap：实现Map接口的抽象类\n");

        updateOutput(output.toString());
    }

    /**
     * 展示Collection和Map接口
     */
    private void demonstrateInterfaces() {
        StringBuilder output = new StringBuilder();
        output.append("\n=== Collection和Map接口 ===\n\n");

        // 1. Collection接口
        output.append("1. Collection接口：\n");
        output.append("• boolean add(E e)：添加元素\n");
        output.append("• boolean remove(Object o)：移除元素\n");
        output.append("• boolean contains(Object o)：判断是否包含元素\n");
        output.append("• int size()：获取元素个数\n");
        output.append("• boolean isEmpty()：判断是否为空\n");
        output.append("• Iterator<E> iterator()：返回迭代器\n");
        output.append("• void clear()：清空集合\n\n");

        // 2. List接口
        output.append("2. List接口（继承自Collection）：\n");
        output.append("• E get(int index)：获取指定位置的元素\n");
        output.append("• E set(int index, E element)：替换指定位置的元素\n");
        output.append("• void add(int index, E element)：在指定位置插入元素\n");
        output.append("• E remove(int index)：移除指定位置的元素\n");
        output.append("• ListIterator<E> listIterator()：返回列表迭代器\n\n");

        // 3. Set接口
        output.append("3. Set接口（继承自Collection）：\n");
        output.append("• 不允许重复元素\n");
        output.append("• 没有额外的方法，使用Collection的方法\n");
        output.append("• 有序性取决于具体实现类\n\n");

        // 4. Map接口
        output.append("4. Map接口：\n");
        output.append("• V put(K key, V value)：添加键值对\n");
        output.append("• V get(Object key)：获取指定键的值\n");
        output.append("• V remove(Object key)：移除指定键的映射\n");
        output.append("• boolean containsKey(Object key)：判断是否包含指定键\n");
        output.append("• boolean containsValue(Object value)：判断是否包含指定值\n");
        output.append("• Set<K> keySet()：返回键的Set视图\n");
        output.append("• Collection<V> values()：返回值的Collection视图\n");
        output.append("• Set<Map.Entry<K, V>> entrySet()：返回键值对的Set视图\n");

        updateOutput(output.toString());
    }

    /**
     * 展示集合实现类对比
     */
    private void demonstrateImplementationComparison() {
        StringBuilder output = new StringBuilder();
        output.append("\n=== 集合实现类对比 ===\n\n");

        // 1. List实现类
        output.append("1. List实现类对比：\n");
        output.append("┌───────────┬─────────────┬─────────────┬───────────┐\n");
        output.append("│ 特性      │ ArrayList   │ LinkedList  │ Vector    │\n");
        output.append("├───────────┼─────────────┼─────────────┼───────────┤\n");
        output.append("│ 底层结构  │ 动态数组    │ 双向链表    │ 动态数组  │\n");
        output.append("│ 随机访问  │ O(1)        │ O(n)        │ O(1)      │\n");
        output.append("│ 插入删除  │ O(n)        │ O(1)        │ O(n)      │\n");
        output.append("│ 线程安全  │ 否          │ 否          │ 是        │\n");
        output.append("│ 内存占用  │ 少          │ 较多        │ 少        │\n");
        output.append("└───────────┴─────────────┴─────────────┴───────────┘\n\n");

        // 2. Set实现类
        output.append("2. Set实现类对比：\n");
        output.append("┌───────────┬─────────────┬─────────────┬───────────┐\n");
        output.append("│ 特性      │ HashSet     │ LinkedHashSet│ TreeSet   │\n");
        output.append("├───────────┼─────────────┼─────────────┼───────────┤\n");
        output.append("│ 底层结构  │ HashMap     │ LinkedHashMap│ TreeMap   │\n");
        output.append("│ 有序性    │ 无序        │ 插入顺序    │ 自然顺序  │\n");
        output.append("│ 查找性能  │ O(1)        │ O(1)        │ O(log n)  │\n");
        output.append("│ 内存占用  │ 较少        │ 较多        │ 较多      │\n");
        output.append("└───────────┴─────────────┴─────────────┴───────────┘\n\n");

        // 3. Map实现类
        output.append("3. Map实现类对比：\n");
        output.append("┌───────────┬─────────────┬─────────────┬───────────┬───────────┐\n");
        output.append("│ 特性      │ HashMap     │ LinkedHashMap│ TreeMap   │ Hashtable │\n");
        output.append("├───────────┼─────────────┼─────────────┼───────────┼───────────┤\n");
        output.append("│ 底层结构  │ 数组+链表/树│ HashMap+链表 │ 红黑树    │ 数组+链表 │\n");
        output.append("│ 有序性    │ 无序        │ 插入顺序    │ 键的顺序  │ 无序      │\n");
        output.append("│ 线程安全  │ 否          │ 否          │ 否        │ 是        │\n");
        output.append("│ null键值  │ 允许        │ 允许        │ 键不允许  │ 不允许    │\n");
        output.append("│ 性能      │ 较高        │ 较高        │ 较低      │ 较低      │\n");
        output.append("└───────────┴─────────────┴─────────────┴───────────┴───────────┘\n");

        updateOutput(output.toString());
    }

    /**
     * 展示集合的常见使用场景
     */
    private void demonstrateUsageScenarios() {
        StringBuilder output = new StringBuilder();
        output.append("\n=== 集合常见使用场景 ===\n\n");

        // 1. ArrayList使用场景
        output.append("1. ArrayList适用场景：\n");
        output.append("• 频繁随机访问元素\n");
        output.append("• 元素数量变化不大\n");
        output.append("• 需要快速遍历\n");
        output.append("例：存储和遍历用户列表、缓存查询结果\n\n");

        // 2. LinkedList使用场景
        output.append("2. LinkedList适用场景：\n");
        output.append("• 频繁在任意位置插入、删除元素\n");
        output.append("• 实现队列、栈等数据结构\n");
        output.append("例：消息队列、撤销操作历史\n\n");

        // 3. HashSet使用场景
        output.append("3. HashSet适用场景：\n");
        output.append("• 需要去重\n");
        output.append("• 不关心元素顺序\n");
        output.append("例：收集唯一值、检查元素是否存在\n\n");

        // 4. LinkedHashSet使用场景
        output.append("4. LinkedHashSet适用场景：\n");
        output.append("• 需要去重\n");
        output.append("• 需要维护插入顺序\n");
        output.append("例：有序的不重复集合、LRU缓存实现\n\n");

        // 5. TreeSet使用场景
        output.append("5. TreeSet适用场景：\n");
        output.append("• 需要去重\n");
        output.append("• 需要有序（自然顺序或自定义顺序）\n");
        output.append("例：排行榜、有序词典\n\n");

        // 6. HashMap使用场景
        output.append("6. HashMap使用场景：\n");
        output.append("• 快速查找值\n");
        output.append("• 维护键值对关系\n");
        output.append("例：缓存、配置参数查询\n\n");

        // 7. TreeMap使用场景
        output.append("7. TreeMap使用场景：\n");
        output.append("• 需要键值对按键排序\n");
        output.append("• 需要范围查询\n");
        output.append("例：词典、时间排序的事件\n");

        updateOutput(output.toString());
    }

    /**
     * 展示集合的选择原则
     */
    private void demonstrateSelectionPrinciples() {
        StringBuilder output = new StringBuilder();
        output.append("\n=== 集合选择原则 ===\n\n");

        // 1. 操作频率
        output.append("1. 根据操作频率选择：\n");
        output.append("• 频繁随机访问：ArrayList\n");
        output.append("• 频繁插入删除：LinkedList\n");
        output.append("• 频繁查找：HashMap/HashSet\n");
        output.append("• 频繁排序：TreeMap/TreeSet\n\n");

        // 2. 数据特性
        output.append("2. 根据数据特性选择：\n");
        output.append("• 需要键值对：Map家族\n");
        output.append("• 需要唯一性：Set家族\n");
        output.append("• 需要随机访问：ArrayList\n");
        output.append("• 需要有序性：LinkedHashMap/TreeMap/LinkedHashSet/TreeSet\n\n");

        // 3. 线程安全考虑
        output.append("3. 线程安全考虑：\n");
        output.append("• 单线程环境：非同步集合（HashMap, ArrayList等）\n");
        output.append("• 多线程读多写少：ConcurrentHashMap\n");
        output.append("• 多线程读写频繁：同步包装器或java.util.concurrent包下的集合\n\n");

        // 4. 性能与内存考虑
        output.append("4. 性能与内存考虑：\n");
        output.append("• 性能要求高：HashMap/ArrayList\n");
        output.append("• 内存占用敏感：数组或原始集合，避免包装\n");
        output.append("• 初始容量：预估数据量，减少扩容操作\n");
        output.append("• 大数据量：考虑使用流式处理\n\n");

        // 5. 常见错误
        output.append("5. 常见错误：\n");
        output.append("• 在循环中从集合中删除元素（使用Iterator）\n");
        output.append("• 未覆盖hashCode()与equals()方法\n");
        output.append("• 使用原始类型（raw type）而非泛型\n");
        output.append("• 忽略并发修改异常（ConcurrentModificationException）\n");

        updateOutput(output.toString());
    }

    /**
     * 更新输出文本
     */
    private void updateOutput(String text) {
        tvOutput.append(text);
    }
} 